/*
    通用功能类，与业务无关的功能实现
        1. 获取系统时间
        2. 获取文件大小
        3. 创建目录
        4. 获取文件所在目录
*/
#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <ctime>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
namespace bitlog
{
    namespace util
    {
        class Date
        {
        public:
            static size_t getTime()
            {
                return (size_t)time(nullptr);
            }
        };

        class File
        {
        private:
            /* data */
        public:
            static bool exists(const std::string &pathname){ // 文件路径名
                // linux系统调用接口 系统不通用 return (access(pathname.c_str(), F_OK) == 0);

                struct stat st;
                if(stat(pathname.c_str(), &st) < 0) return false;
                return true;
            }

            static std::string path(const std::string &pathname){
                size_t pos = pathname.find_last_of("/\\");
                if(pos == std::string::npos) return ".";
                return pathname.substr(0, pos+1); // 起始位置 长度
            }

            static void createDirectory(const std::string &pathname){
                // ./abc/bcd/cde
                size_t pos = 0, idx = 0;
                while(idx < pathname.size()){
                    pos = pathname.find_first_of("/\\", idx);
                    if(pos == std::string::npos){
                        mkdir(pathname.c_str(), 0777);
                    }
                    std::string parent_dir = pathname.substr(0, pos + 1); // 从向向后依次拿出每一目录的名字 +1包含斜杠 abc/ abc/bcd/ abc/bcd/cde/
                    //if(parent_dir == "." || parent_dir == "..") {idx = pos + 1; continue;} 当前存在的特判
                    if(exists(parent_dir) == true) {idx = pos + 1; continue;}
                    mkdir(parent_dir.c_str(), 0777);
                    idx = pos + 1;
                }
            }
        };

    } // namespace util

}
#endif